
#include <iostream>
#include <list>
#include <utility>
#include <cstring>
using namespace std;

namespace bit {
    class string {
    private:
        char* _str;
        size_t _size;
        
    public:
        // 构造函数
        string(const char* str = "") : _size(strlen(str)) {
            _str = new char[_size + 1];
            strcpy(_str, str);
            cout << "string(char* str)" << endl;
        }
        
        // 拷贝构造函数
        string(const string& s) : _size(s._size) {
            _str = new char[_size + 1];
            strcpy(_str, s._str);
            cout << "string(const string& s) -- 拷贝构造" << endl;
        }
        
        // 移动构造函数
        string(string&& s) noexcept : _str(s._str), _size(s._size) {
            s._str = nullptr;  // 重要：将源对象置为空
            s._size = 0;
            cout << "string(string&& s) -- 移动构造" << endl;
        }
        
        // 拷贝赋值运算符
        string& operator=(const string& s) {
            if (this != &s) {
                delete[] _str;
                _size = s._size;
                _str = new char[_size + 1];
                strcpy(_str, s._str);
            }
            return *this;
        }
        
        // 移动赋值运算符
        string& operator=(string&& s) noexcept {
            if (this != &s) {
                delete[] _str;
                _str = s._str;
                _size = s._size;
                s._str = nullptr;
                s._size = 0;
            }
            return *this;
        }
        
        // 析构函数
        ~string() {
            delete[] _str;
            cout << "~string() -- 析构" << endl;
        }
        
        // 获取C风格字符串
        const char* c_str() const { return _str; }
        
        // 获取大小
        size_t size() const { return _size; }
        
        // 判断是否为空
        bool empty() const { return _size == 0; }
        
        // 重载输出运算符
        friend ostream& operator<<(ostream& os, const string& s) {
            os << (s._str ? s._str : "(null)");
            return os;
        }
    };
}

int main()
{
    std::list<bit::string> lt;

    bit::string s1("11111111111111111111111");
    lt.push_back(s1);
    cout << "******************************" << endl;

    lt.push_back(bit::string("22222222222222222222222222222"));
    cout << "******************************" << endl;

    lt.push_back("33333333333333333333333333333");
    cout << "******************************" << endl;

    lt.push_back(move(s1));
    cout << "******************************" << endl;
    
    // 验证移动后s1的状态
    cout << "移动后s1的状态验证:" << endl;
    cout << "s1的内容: " << s1 << endl;
    cout << "s1的大小: " << s1.size() << endl;
    cout << "s1是否为空: " << (s1.empty() ? "是" : "否") << endl;
    
    // 可以重新赋值使用
    s1 = "重新赋值后的内容";
    cout << "重新赋值后s1: " << s1 << endl;
    cout << "******************************" << endl;

    return 0;
}
